home *** CD-ROM | disk | FTP | other *** search
- /*------------------------------------------------------------------------------------------------
- CmDriver.c Version: 2.0 GM
-
- Copyright © 1994 by Apple Computer, Inc. All rights reserved.
- Copyright © 1994 by Eastman Kodak Company, All rights reserved.
-
- Apple Paul Hangas
- Kodak Takeshi Domen
-
- History
- 8/26/94 Version 2.0 d1 is the first release to Nimbus driver.
- 9/12/94 Version 2.0 d2
- Debugged SearchQuickTakeDriver function so as to judge the NULL pointer.
- CmGetPortInfo and CmConnect were modified.
- 9/26/94 Version 2.0 a1c1
- 9/28/94 Version 2.0 a1c1
- In SearchQuickTakeDriver function, the device control entry comes to be got
- by handle (Bug number NMD-AP-004). Similarly, CmOpenDriver was changed.
- In CmConnect function, incorrect locking of handle was repaired.
- 9/29/94 Version 2.0 a2
- In SearchQuickTakeDriver function was added some lines as Alex-san specified.
- CmOpenDriver was added NULL judgment of DCE handle. (Bug Number NMD-AP-008).
- 10/28/94 Version 2.0 b1c1
- kDriverName was changed from QuickTake to QuickTake2.
- 11/11/94 Version 2.0 b1c2
- Improved error reporting for QuickTake™ 100 and QuickTake™ 150 drivers.
- When the QuickTake™ 100 driver is found and the QuickTake™ 150 driver is not
- found, a new error, kCmDrvrVersionError, is returned. Needed to rewrite
- SearchQuickTakeDriver to implement this.
- 12/ 1/94 Version 2.0 b2
- 12/15/94 Version 2.0 f1c1
- 1/ 9/95 Version 2.0 GM
- ------------------------------------------------------------------------------------------------*/
-
- #include <Types.h>
- #include <Files.h>
- #include <Devices.h>
- #include <Memory.h>
- #include <String.h>
- #include <Errors.h>
- #include <Events.h>
- #include "CmDriver.h"
-
- /* **WARNING** Note direct reference to low memory global! */
- #ifndef LMGetUnitTableCount
- #define LMGetUnitTableCount() (*(short *) 0x1D2)
- #endif
-
- #define kStartUnitNum 48 /* Beginning of non-reserved unit numbers. */
- #define kDriverNameOffset 18 /* Offset in driver to driver name. */
-
- #ifndef dRAMBased
- #define dRAMBased 6
- #endif
-
- #define kQTake100DrvrName "\p.QuickTake"
- #define kQTake150DrvrName "\p.QuickTake2" // Changed 10/24/94 by Domen
-
- //--------------------------------------------------------------------------------------------------
- typedef unsigned long ulong;
- typedef unsigned char uchar;
- typedef unsigned short ushort;
- //--------------------------------------------------------------------------------------------------
-
- // CSCode
- #define CS_OPEN 30
- #define CS_INQUIRY 31
- #define CS_REZERO_UNIT 32
- #define CS_SCAN 33
- #define CS_SEND_DIAGNOSTICS 34
- #define CS_CAMERA_INFO 35
- #define CS_THUMB_INFO 36
- #define CS_FULL_INFO 37
- #define CS_DATE_TIME 38
- #define CS_CAMERA_ID 39
- #define CS_BAUD_RATE 40
- #define CS_COMP_MODE 41
- #define CS_PICTURE_MODE 42
- #define CS_FLASH_MODE 43
- #define CS_TIMEOUT 44
- #define CS_UNIT_READY 45
- #define CS_ERASE 46
- #define CS_GETPORTINF 47
- #define CS_CONNECT 48
- #define CS_DISCONNECT 49
- #define CS_REQUEST 50
- #define CS_COMP_INFO 51
- #define CS_MATRIX_INFO 52
- #define CS_GETSTDFEATURES 102
- #define CS_SLEEPDELAY 55
-
- pascal short SearchQuickTakeDriver(Boolean *QTake150DrvrFound, Boolean *QTake100DrvrFound);
- pascal short CheckCameraData(CameraData cameraData);
- static Boolean StringsEqual(Str255 a, Str255 b);
- //**************************************************************************************************
- // CmOpenDriver
- //
- // Open the Camera Driver. Driver memory is allocated and High Speed Serial code is loaded.
- //--------------------------------------------------------------------------------------------------
- pascal OSErr CmOpenDriver(CameraDataPtr cameraData)
- {
- OSErr err;
- short QuickTakeRefNum;
- DCtlHandle dce;
- Boolean QTake150DrvrFound, QTake100DrvrFound;
-
- QuickTakeRefNum = SearchQuickTakeDriver(&QTake150DrvrFound, &QTake100DrvrFound); // Verify QuickTake™ driver is really installed.
-
- if ((!QTake150DrvrFound) && (QTake100DrvrFound) ) //11/10/94 added by Alex P
- return (kCmDrvrVersionError);
-
- if (QuickTakeRefNum == 0)
- return(kCmDriverNotLoadedError);
-
- dce = GetDCtlEntry(QuickTakeRefNum);
-
- if (!dce) // 10/7/94 Added by Domen
- return(kCmDriverNotLoadedError);
-
- if ((*dce)->dCtlFlags & 0x20)
- return(kCmAlreadyOpenError);
-
- if ((*cameraData = (CameraData)NewPtrClear( sizeof(CmCameraData) )) == NULL)
- return(kCmNoMemoryError);
-
- (*cameraData)->currentA5 = SetCurrentA5();
-
- (*cameraData)->paramBlock.ioParam.ioNamePtr = kQTake150DrvrName;
- (*cameraData)->paramBlock.ioParam.ioPermssn = fsRdWrPerm;
-
- err = PBOpen(&(*cameraData)->paramBlock, false);
-
- if (err != noErr) {
- DisposePtr((Ptr)*cameraData);
- *cameraData = NULL;
- }
- return(err);
- }
-
- //**************************************************************************************************
- // CmCloseDriver
- //
- // Close the Camera Driver. Driver memory is disposed and High Speed Serial code is disposed.
- //--------------------------------------------------------------------------------------------------
- pascal OSErr CmCloseDriver(CameraData cameraData)
- {
- OSErr err;
- ParamBlockRec pb;
-
- if ((err = CheckCameraData(cameraData)) != noErr)
- return (err);
-
- pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
-
- if (cameraData->connectedFlag == true)
- return (kCmCurrentlyConnectedError);
-
- err = PBClose(&cameraData->paramBlock, false);
-
- if (err == noErr) {
- DisposePtr((Ptr)cameraData);
- }
-
- return(err);
- }
-
- //**************************************************************************************************
- // CmGetStdFeatures
- //
- // Retrieve the standard features of the camera (whose data is known by QuickTake™ Driver)
- // in context.
- //--------------------------------------------------------------------------------------------------
- pascal OSErr CmGetStdFeatures(CameraData cameraData,
- CmStdFeaturesPtr stdFeaturesPtr,
- short length)
- {
- OSErr err;
- ParamBlockRec pb;
-
- if ((err = CheckCameraData(cameraData)) != noErr)
- return (err);
-
- pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
-
- pb.cntrlParam.csCode = CS_GETSTDFEATURES;
- *((CmStdFeatures **)(&pb.cntrlParam.csParam[0])) = stdFeaturesPtr;
- pb.cntrlParam.csParam[2] = length;
-
- err = PBStatus(&pb, false);
-
- return(err);
-
- }
-
- //**************************************************************************************************
- // CmGetPortInfo
- //
- // Get the Port information.
- //--------------------------------------------------------------------------------------------------
- pascal OSErr CmGetPortInfo(CameraData cameraData,
- unsigned long index,
- CmPortInfoHandlePtr portInfoHandle)
- {
- OSErr err;
- ParamBlockRec pb;
-
- if ((err = CheckCameraData(cameraData)) != noErr)
- return (err);
-
- pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
-
- pb.cntrlParam.csCode = CS_GETPORTINF;
-
- *((unsigned long*)(&pb.cntrlParam.csParam[0])) = index;
- *portInfoHandle = (CmPortInfoHandle)NewHandleClear( sizeof(CmPortInfo) );
- if (*portInfoHandle == NULL)
- return(kCmNoMemoryError);
-
- HLock((Handle)*portInfoHandle);// 9/12/94 Domen
-
- *((CmPortInfoPtr*)(&pb.cntrlParam.csParam[2])) = **portInfoHandle;
-
- err = PBControl(&pb, false);
-
- HUnlock((Handle)*portInfoHandle);// 9/12/94 Domen
-
- if (err != noErr) {
- DisposeHandle((Handle)*portInfoHandle);
- *portInfoHandle = NULL;
- }
- return(err);
- }
-
- //**************************************************************************************************
- // CmDisposePortInfo
- //
- // Frees the CmPortInfo structure previously allocated by CmGetPortInfo.
- //--------------------------------------------------------------------------------------------------
- pascal OSErr CmDisposePortInfo(CameraData cameraData,
- CmPortInfoHandle portInfoHandle)
- {
- OSErr err;
- Handle tempH;
-
- if ((err = CheckCameraData(cameraData)) != noErr)
- return (err);
-
- if (GetHandleSize((Handle)portInfoHandle) != sizeof(CmPortInfo))
- return(kCmBadArgError);
-
- HLock((Handle)portInfoHandle);
-
- tempH = (*portInfoHandle)->portIcon;
- if (tempH) DisposeHandle(tempH);
-
- tempH = (Handle)(*portInfoHandle)->portName;
- if (tempH) DisposeHandle(tempH);
-
- tempH = (Handle)(*portInfoHandle)->appName;
- if (tempH) DisposeHandle(tempH);
-
- tempH = (*portInfoHandle)->portConfig;
- if (tempH) DisposeHandle(tempH);
-
- HUnlock((Handle)portInfoHandle);
-
- DisposeHandle((Handle)portInfoHandle);
-
- return(noErr);
- }
-
- //**************************************************************************************************
- // CmConnect
- //
- // Open a connection to the camera.
- //--------------------------------------------------------------------------------------------------
- pascal OSErr CmConnect(CameraData cameraData,
- CmPortInfoHandle portInfoHandle)
- {
- OSErr err;
- ParamBlockRec pb;
- char state;
-
- if ((err = CheckCameraData(cameraData)) != noErr)
- return (err);
-
- pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
-
- if (GetHandleSize((Handle)portInfoHandle) != sizeof(CmPortInfo))
- return(kCmBadArgError);
-
- pb.cntrlParam.csCode = CS_CONNECT;
-
- state = HGetState((Handle)portInfoHandle);// 9/12/94 Domen
-
- HLock((Handle)portInfoHandle);// 9/28/94 Domen
-
- *((CmPortInfo**)(&pb.cntrlParam.csParam[0])) = *portInfoHandle;
-
- err = PBControl(&pb, false);
-
- HSetState((Handle)portInfoHandle,state);// 9/12/94 Domen
-
- if (err == noErr)
- cameraData->connectedFlag = true;
-
- return(err);
- }
-
- //**************************************************************************************************
- // CmDisconnect
- //
- // Close the connection to the camera.
- //--------------------------------------------------------------------------------------------------
- pascal OSErr CmDisconnect(CameraData cameraData)
- {
- OSErr err;
- ParamBlockRec pb;
-
- if (cameraData == NULL) return(kCmBadArgError);
-
- if (GetPtrSize((Ptr)cameraData) != sizeof(CmCameraData))
- return(kCmBadArgError);
-
- pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
-
- if (cameraData->paramBlock.cntrlParam.ioResult == 1) {
- PBKillIO(&pb, false);
- }
-
- if (cameraData->connectedFlag == false)
- return (kCmNotConnectedError);
-
- pb.cntrlParam.csCode = CS_DISCONNECT;
-
- err = PBControl(&pb, false);
-
- if (err == noErr)
- cameraData->connectedFlag = false;
-
- return(err);
- }
-
- //**************************************************************************************************
- // CmCheckIfReady
- //
- // Check if the camera is ready for commands.
- //--------------------------------------------------------------------------------------------------
- pascal OSErr CmCheckIfReady(CameraData cameraData)
- {
- OSErr err;
- ParamBlockRec pb;
-
- if ((err = CheckCameraData(cameraData)) != noErr)
- return (err);
-
- pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
-
- pb.cntrlParam.csCode = CS_UNIT_READY;
-
- err = PBControl(&pb, false);
-
- return(err);
- }
-
- //**************************************************************************************************
- // CmRestoreDefaults
- //
- // Revert some of the characteristics of the camera to their factory settings.
- //--------------------------------------------------------------------------------------------------
- pascal OSErr CmRestoreDefaults(CameraData cameraData)
- {
- OSErr err;
- ParamBlockRec pb;
-
- if ((err = CheckCameraData(cameraData)) != noErr)
- return (err);
-
- pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
-
- pb.cntrlParam.csCode = CS_REZERO_UNIT;
-
- err = PBControl(&pb, false);
-
- return(err);
- }
-
- //**************************************************************************************************
- // CmGetErrorInfo
- //
- // Get the detailed error information from the camera, on an error encountered by the last
- // command sent to the camera.
- //--------------------------------------------------------------------------------------------------
- pascal OSErr CmGetErrorInfo(CameraData cameraData,
- shortPtr category,
- shortPtr diagnosticsCode)
- {
- OSErr err;
- ParamBlockRec pb;
-
- if ((err = CheckCameraData(cameraData)) != noErr)
- return (err);
-
- pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
-
- pb.cntrlParam.csCode = CS_REQUEST;
-
- *((short **)(&pb.cntrlParam.csParam[0])) = category;
- *((short **)(&pb.cntrlParam.csParam[2])) = diagnosticsCode;
-
- err = PBStatus(&pb, false);
-
- return(err);
- }
-
- //**************************************************************************************************
- // CmGetProductInfo
- //
- // Get the product specific information related to the camera in context.
- //--------------------------------------------------------------------------------------------------
- pascal OSErr CmGetProductInfo(CameraData cameraData,
- CmProductInfoPtr productInfo)
- {
- OSErr err;
- ParamBlockRec pb;
-
- if ((err = CheckCameraData(cameraData)) != noErr)
- return (err);
-
- pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
- pb.cntrlParam.csCode = CS_INQUIRY;
- *((CmProductInfoPtr*)(&pb.cntrlParam.csParam[0])) = productInfo;
-
- err = PBControl(&pb, false);
-
- return(err);
- }
-
- //**************************************************************************************************
- // CmTakePicture
- //
- // Send the signal to the camera, which let it take a picture.
- //--------------------------------------------------------------------------------------------------
- pascal OSErr CmTakePicture(CameraData cameraData,
- Boolean timerOn)
- {
- OSErr err;
- ParamBlockRec pb;
-
- if ((err = CheckCameraData(cameraData)) != noErr)
- return (err);
-
- pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
-
- pb.cntrlParam.csCode = CS_SCAN;
-
- *((Boolean*)(&pb.cntrlParam.csParam[0])) = timerOn;
-
- err = PBControl(&pb, false);
-
- return(err);
- }
-
- //**************************************************************************************************
- // CmSelfTest
- //
- // Trigger the diagnostics test built into the camera.
- //--------------------------------------------------------------------------------------------------
- pascal OSErr CmSelfTest(CameraData cameraData)
- {
- OSErr err;
- ParamBlockRec pb;
-
- if ((err = CheckCameraData(cameraData)) != noErr)
- return (err);
-
- pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
-
- pb.cntrlParam.csCode = CS_SEND_DIAGNOSTICS;
-
- err = PBControl(&pb, false);
-
- return(err);
- }
-
- //**************************************************************************************************
- // CmGetCameraInfo
- //
- // Retrieve information related to the camera in context.
- //--------------------------------------------------------------------------------------------------
- pascal OSErr CmGetCameraInfo(CameraData cameraData,
- CmCameraInfoPtr cameraInfo)
- {
- OSErr err;
- ParamBlockRec pb;
-
- if ((err = CheckCameraData(cameraData)) != noErr)
- return (err);
-
- pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
-
- pb.cntrlParam.csCode = CS_CAMERA_INFO;
- *((CmCameraInfoPtr*)(&pb.cntrlParam.csParam[0])) = cameraInfo;
-
- err = PBControl(&pb, false);
-
- return(err);
- }
-
- //**************************************************************************************************
- // CmGetPictureInfo
- //
- // Retrieve information related to a particular picture stored in the camera.
- //--------------------------------------------------------------------------------------------------
- pascal OSErr CmGetPictureInfo(CameraData cameraData,
- unsigned short pictureNo,
- CmPictureInfoPtr pictureInfo)
- {
- OSErr err;
- ParamBlockRec pb;
-
- if ((err = CheckCameraData(cameraData)) != noErr)
- return (err);
-
- pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
-
- pb.cntrlParam.csCode = CS_FULL_INFO;
- *((CmPictureInfoPtr*)(&pb.cntrlParam.csParam[0])) = pictureInfo;
- pb.cntrlParam.csParam[2] = pictureNo;
-
- err = PBControl(&pb, false);
-
- return(err);
- }
-
- //**************************************************************************************************
- // CmGetThumbnailImage
- //
- // Retrieve the thumbnail version of the image of a particular picture.
- //--------------------------------------------------------------------------------------------------
- pascal OSErr CmGetThumbnailImage(CameraData cameraData,
- unsigned short pictureNo,
- BufferPtr thumbnailBuffer,
- unsigned long numberOfBytesToRead,
- Boolean firstRead,
- LongPtr actualBytes) /* the number of bytes actually read */
- {
- OSErr err;
- ParamBlockRec pb;
-
- if ((err = CheckCameraData(cameraData)) != noErr)
- return (err);
-
- pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
-
- thumbnailBuffer[0] = 0;
- *((unsigned short*)(&thumbnailBuffer[1])) = pictureNo;
- *((Boolean*)(&thumbnailBuffer[5])) = firstRead;
-
- pb.ioParam.ioBuffer = (Ptr)thumbnailBuffer;
- pb.ioParam.ioReqCount = numberOfBytesToRead;
-
- err = PBRead(&pb, false);
-
- *actualBytes = pb.ioParam.ioActCount;
-
- return(err);
- }
-
- //**************************************************************************************************
- // CmGetFullSizeIamge
- //
- // Retrieve the fullsize version of the image of a particular picture.
- //--------------------------------------------------------------------------------------------------
- pascal OSErr CmGetFullSizeImage(CameraData cameraData,
- unsigned short pictureNo,
- BufferPtr fullsizeBuffer,
- unsigned long numberOfBytesToRead,
- Boolean firstRead,
- LongPtr actualBytes) /* the number of bytes actually read */
- {
- OSErr err;
- ParamBlockRec pb;
-
- if ((err = CheckCameraData(cameraData)) != noErr)
- return (err);
-
- pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
-
- fullsizeBuffer[0] = 1;
- *(unsigned short *)(&fullsizeBuffer[1]) = pictureNo;
- *((Boolean*)(&fullsizeBuffer[5])) = firstRead;
-
- pb.ioParam.ioBuffer = (Ptr)fullsizeBuffer;
- pb.ioParam.ioReqCount = numberOfBytesToRead;
-
- err = PBRead(&pb, false);
-
- *actualBytes = pb.ioParam.ioActCount;
-
- return(err);
- }
-
- //**************************************************************************************************
- // CmErase
- //
- // Erase the pictures in the camera.
- //--------------------------------------------------------------------------------------------------
- pascal OSErr CmErase(CameraData cameraData)
- {
- OSErr err;
- ParamBlockRec pb;
-
- if ((err = CheckCameraData(cameraData)) != noErr)
- return (err);
-
- pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
-
- pb.cntrlParam.csCode = CS_ERASE;
-
- err = PBControl(&pb, false);
-
- return(err);
- }
-
- //**************************************************************************************************
- // CmSetDateAndTime
- //
- // Set the date and time of the camera.
- //--------------------------------------------------------------------------------------------------
- pascal OSErr CmSetDateAndTime(CameraData cameraData,
- CmDateAndTimePtr dateAndTime)
- {
- OSErr err;
- ParamBlockRec pb;
-
- if ((err = CheckCameraData(cameraData)) != noErr)
- return (err);
-
- pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
-
- pb.cntrlParam.csCode = CS_DATE_TIME;
- *((CmDateAndTime **)(&pb.cntrlParam.csParam[0])) = dateAndTime;
-
- err = PBControl(&pb, false);
-
- return(err);
- }
-
- //**************************************************************************************************
- // CmSetOwnerName
- //
- // Alter the identification of the camera.
- //--------------------------------------------------------------------------------------------------
- pascal OSErr CmSetOwnerName(CameraData cameraData,
- BufferPtr ownerName)
- {
- OSErr err;
- ParamBlockRec pb;
-
- if ((err = CheckCameraData(cameraData)) != noErr)
- return (err);
-
- pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
-
- pb.cntrlParam.csCode = CS_CAMERA_ID;
- *((BufferPtr*)(&pb.cntrlParam.csParam[0])) = ownerName;
-
- err = PBControl(&pb, false);
-
- return(err);
- }
-
- //**************************************************************************************************
- // CmSetPictureMode
- //
- // Alter the picture mode of the camera.
- //--------------------------------------------------------------------------------------------------
- pascal OSErr CmSetPictureMode(CameraData cameraData,
- unsigned char pictureMode)
- {
- OSErr err;
- ParamBlockRec pb;
-
- if ((err = CheckCameraData(cameraData)) != noErr)
- return (err);
-
- pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
-
- pb.cntrlParam.csCode = CS_PICTURE_MODE;
- *((unsigned char*)(&pb.cntrlParam.csParam[0])) = pictureMode;
-
- err = PBControl(&pb, false);
-
- return(err);
- }
-
- //**************************************************************************************************
- // CmSetFlashMode
- //
- // Set the flash mode in the camera.
- //--------------------------------------------------------------------------------------------------
- pascal OSErr CmSetFlashMode(CameraData cameraData,
- unsigned char flashMode)
- {
- OSErr err;
- ParamBlockRec pb;
-
- if ((err = CheckCameraData(cameraData)) != noErr)
- return (err);
-
- pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
-
- pb.cntrlParam.csCode = CS_FLASH_MODE;
- *((unsigned char*)(&pb.cntrlParam.csParam[0])) = flashMode;
-
- err = PBControl(&pb, false);
-
- return(err);
- }
-
- //**************************************************************************************************
- // CmTakePictureAsync
- //
- // Send the signal to the camera, which let it take a picture.
- //--------------------------------------------------------------------------------------------------
- pascal OSErr CmTakePictureAsync(CameraData cameraData,
- Boolean timerOn,
- CmAsyncCompletionRoutinePtr CmAsyncCompletionRoutine)
- {
- OSErr err;
-
- if ((err = CheckCameraData(cameraData)) != noErr)
- return (err);
-
- cameraData->paramBlock.cntrlParam.ioCompletion = (IOCompletionUPP) CmAsyncCompletionRoutine;
- cameraData->paramBlock.cntrlParam.csCode = CS_SCAN;
- *((Boolean *)(&cameraData->paramBlock.cntrlParam.csParam[0])) = timerOn;
-
- err = PBControl(&(cameraData->paramBlock),true);
-
- return(err);
- }
-
- //**************************************************************************************************
- // CmEraseAsync
- //
- // Erase the pictures in the camera.
- //--------------------------------------------------------------------------------------------------
- pascal OSErr CmEraseAsync(CameraData cameraData,
- CmAsyncCompletionRoutinePtr CmAsyncCompletionRoutine)
- {
- OSErr err;
-
- if ((err = CheckCameraData(cameraData)) != noErr)
- return (err);
-
- cameraData->paramBlock.cntrlParam.ioCompletion = (IOCompletionUPP)CmAsyncCompletionRoutine;
- cameraData->paramBlock.cntrlParam.csCode = CS_ERASE;
-
- err = PBControl(&(cameraData->paramBlock), true);
-
- return(err);
- }
-
- //**************************************************************************************************
- // CmGetDecompTable
- //
- // Get the data compression/decompression table
- //--------------------------------------------------------------------------------------------------
- pascal OSErr CmGetDecompTable(CameraData cameraData,
- BufferPtr ipmInfo)
- {
- OSErr err;
- ParamBlockRec pb;
-
- if ((err = CheckCameraData(cameraData)) != noErr)
- return (err);
-
- pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
-
- pb.cntrlParam.csCode = CS_COMP_INFO;
- *((BufferPtr*)(&pb.cntrlParam.csParam[0])) = ipmInfo;
-
- err = PBControl(&pb, false);
-
- return(err);
- }
-
- //**************************************************************************************************
- // CmGetColorCorrectionMatrix
- //
- // Get the camera color correction matrix
- //--------------------------------------------------------------------------------------------------
- pascal OSErr CmGetColorCorrectionMatrix(CameraData cameraData,
- CmColorMatrixPtr colorMatrix)
- {
- OSErr err;
- ParamBlockRec pb;
-
- if ((err = CheckCameraData(cameraData)) != noErr)
- return (err);
-
- pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
-
- pb.cntrlParam.csCode = CS_MATRIX_INFO;
- *((CmColorMatrixPtr*)(&pb.cntrlParam.csParam[0])) = colorMatrix;
-
- err = PBControl(&pb, false);
-
- return(err);
- }
-
- //**************************************************************************************************
- // CmSetSleep
- //
- // Set the sleep delay (while connected to a computer) of the camera
- //--------------------------------------------------------------------------------------------------
- pascal OSErr CmSetSleep(CameraData cameraData,
- short sleepDelay)
- {
- OSErr err;
- ParamBlockRec pb;
-
- if ((err = CheckCameraData(cameraData)) != noErr)
- return (err);
-
- pb.cntrlParam.ioCRefNum = cameraData->paramBlock.cntrlParam.ioCRefNum;
-
- pb.cntrlParam.csCode = CS_SLEEPDELAY;
- pb.cntrlParam.csParam[0] = sleepDelay;
-
- err = PBControl(&pb, false);
-
- return(err);
- }
-
- //**************************************************************************************************
- // SearchQuickTakeDriver
- // This function is local one to search the reference number of QuickTake™ Camera driver.
- // If the QuickTake™ Camera driver can be found, return the reference number.
- // Otherwise, return zero.
- //--------------------------------------------------------------------------------------------------
- pascal short SearchQuickTakeDriver(Boolean *QTake150DrvrFound, Boolean *QTake100DrvrFound)
- {
- DCtlHandle curDCtlEntry;
- Ptr curDrvrPtr;
- short unitNum;
- short unitTableCount;
- short refNum = 0;
-
- *QTake100DrvrFound = false;
- *QTake150DrvrFound = false;
- unitTableCount = LMGetUnitTableCount();
-
- /* Walk through non-reserved entries in the Unit Table. We assume at least 48 */
- /* available entries as we are running on at least a Mac II or later. */
- for (unitNum = kStartUnitNum; unitNum < unitTableCount; ++unitNum)
- {
- curDCtlEntry = GetDCtlEntry(~unitNum);
-
- if (curDCtlEntry != nil)
- {
- /* If RAM bit set, it's a handle. Otherwise it's a pointer. */
- if ((**curDCtlEntry).dCtlFlags & (1 << dRAMBased))
- {
- /* Dereference for handle based driver. */
- curDrvrPtr = *((Handle)(**curDCtlEntry).dCtlDriver);
- }
- else
- {
- curDrvrPtr = (**curDCtlEntry).dCtlDriver;
- }
-
- if (curDrvrPtr != nil)
- {
- /* Does the driver name match? */
- if (StringsEqual(kQTake150DrvrName, (unsigned char *)(curDrvrPtr + kDriverNameOffset)))
- {
- /* Found QuickTake™ Camera 2.0. Save the refNum and exit our search loop. */
- *QTake150DrvrFound = true;
- refNum = ~unitNum;
- break;
- } //11/10/94 added by Alex P
- else if ((!(*QTake100DrvrFound)) && (StringsEqual(kQTake100DrvrName, (unsigned char *)(curDrvrPtr + kDriverNameOffset))))
- /* Found QuickTake™ Camera 1.0; continue looking for the 2.0 version*/
- *QTake100DrvrFound = true;
- }
- }
- }
-
- return (refNum);
- }
-
- /***************************************************************************************************
- // StringsEqual
- // Simple counted (Pascal) string compare.
- //
- // Returns true if all bits in the strings are equal OR
- // if both parameters (a and b) are NULL.
- // If only one of the parameters (a or b) is NULL,
- // we assume an invalid parameter and return false.
- //------------------------------------------------------------------------------------------------*/
- static Boolean StringsEqual(Str255 a, Str255 b)
- {
- Boolean result = true; /* Assume strings equal. */
- short count;
-
-
- if (a != b)
- {
- if ((a != NULL) && (b != NULL))
- {
- count = (short)(*(unsigned char *)a);
-
- do
- {
- if (*a++ != *b++)
- {
- result = false;
- break;
- }
- } while (count-- > 0);
- }
- else
- {
- result = false;
- }
- }
-
- return (result);
- }
-
- //**************************************************************************************************
- // CheckCameraData
- // This function is local one to check camera data.
- // This returns next:
- // noErr
- // kCmBadArgError
- // kCmAIPError
- //--------------------------------------------------------------------------------------------------
- pascal short CheckCameraData(CameraData cameraData)
- {
- if (cameraData == NULL) return(kCmBadArgError);
-
- if (GetPtrSize((Ptr)cameraData) != sizeof(CmCameraData))
- return(kCmBadArgError);
-
- if (cameraData->paramBlock.cntrlParam.ioResult == 1)
- return(kCmAIPError);
-
- return(noErr);
- }
-